package d0509;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Java 语法基础
 * Java OOP
 * Java API  Java 应用程序接口, Java官方提供一系列的接口,类
 * 		java 异常
 * 		java lang包
 * 		java util包
 * 		java io 包
 * 		java jdbc 
 * 
 */
public class 认识异常 {
	
	
	public static void ex1(int b, int c) {
		try {
			//  try 运行代码, 出现异常,就会在异常出现的地方终止运行
			int a = b / c;   // 此处有可能产生运行时异常 ArithmeticException
			System.out.println("结束:" + a);
		} catch ( ArithmeticException ae) {
			//  catch 用于捕获可能出现的异常, 并且尝试修复程序流程
			System.out.println("除数不能为0!");
		} finally {
			// finally 最终执行的代码, 不管try 中的代码是否出现异常, 都将执行该代码
			// 一般用于关闭特定资源, 资源回收的操作
			System.out.println("finally 最终执行的代码");
		}
		
		System.out.println("ex1 运行结束");
	}
	
	public static void main(String[] args) {
		ex1(5, 3);
		System.out.println("=======1========");
		ex2();
		System.out.println("=======2========");
		ex1(5, 0);
		System.out.println("=======3========");
		ex1(10, 2);
		
		
		System.out.println("=======4========");
		try {
			ex3("d:\\a.txt");
		} catch( FileNotFoundException e1) {
			System.out.println(e1.getMessage());
		} catch (IOException e2) {
			System.out.println(e2.getMessage());
		}
		
	}
	
	public static void ex2() {
		
		// Unhandled exception type FileNotFoundException
		// 未处理的异常 File Not Found Exception  编译器异常
		// FileInputStream fis = new FileInputStream("d:\\a.txt");
		
		// 处理
		
		// 构造方法
		// Exception a = new Exception("数组长度不够.."); 
		// Exception a = new Exception("数组长度不够..", Throwable a);  // 构造方法
		
		// 异常包含信息: 1. 异常的描述,  2. 异常原因
		Exception a = new Exception("数组长度不够..");
		
		// 异常属性
		System.out.println("ex2:  "+a.getMessage()); // message 异常的描述信息
		System.out.println("ex2:  "+a.getCause());	// cause 异常的原因
		
		// 打印异常
		a.printStackTrace();  // 打印异常
		
	}
	
	public static void ex3(String filename) throws FileNotFoundException,IOException {
		FileInputStream fis = null;
		try {
			// 编译期异常
			fis = new FileInputStream(filename);
		} catch (FileNotFoundException e) {
			// 接收到异常, 但是无法处理, 抛出异常
			// 如果抛出某个编译期异常, 那么抛出异常的方法必须要声明被抛出的"编译期异常"
			throw e;  
		} finally {
			// 关闭文件输出流  , 没有补货那么自动抛出
			fis.close();  // 如果没有捕获编译期异常, 那么该编译期异常必须声明到方法的抛出异常列表中
		}
	}
	
	

}
